'''
OpenMV4P_micro
模板匹配

本程序采用模板匹配+实时更新。可以在目标发生简单变动后依然识别，但长时间运行有不稳定因素。
云台追踪中，也使用类似策略，但需要更详细纠错逻辑。
'''
import sensor, image, time,lcd
from button import BUTTON

sensor.reset()
sensor.set_pixformat(sensor.GRAYSCALE)    # Set pixel format to RGB565 (or GRAYSCALE)
sensor.set_framesize(sensor.QQVGA)
sensor.set_windowing((96,96))
sensor.skip_frames(time=1000) # Let new settings take affect.
#sensor.set_vflip(True)
#sensor.set_hmirror(True)
clock = time.clock()
#lcd.init(type=2,width=240,height=320)
lcd.init()
lcd.clear()
button=BUTTON()  #声明按键，梦飞openmv只有一个按键，因此直接内部指定了按键

temp_width= 36
temp_height= 36
image_data = sensor.alloc_extra_fb(temp_width,temp_height, sensor.GRAYSCALE)

click_timer=time.ticks_ms()          #开始计时
mode =0 #默认录入模式

def register_tamplate():
    while True:
        clock.tick()
        img = sensor.snapshot()
        if button.event():
            button.key_event=0
            ROI=(int(img.width()/2-15),int(img.height()/2-15),temp_width,temp_height)
            image_data.clear()
            image_data.draw_image(img,0,0,x_scale=1,y_scale=1,roi=ROI)#将roi画到模板画布上
            break
        img.draw_rectangle(int(img.width()/2-15),int(img.height()/2-15),temp_width,temp_height,thickness=2)
        lcd.display(img)

def traking_tamplate():
    #识别模式
    while True:
        img = sensor.snapshot()
        results = img.find_template(image_data, 0.70, step=2, search=image.SEARCH_EX)
        if results:
            print(results)
            #image_data.draw_image(img,0,0,roi=results)
            img.draw_rectangle(results,thickness=2,color=(255,0,0))
        lcd.display(img)
        if button.event():
            button.key_event=0
            break


while True:
    register_tamplate() #注册模式
    traking_tamplate()  #识别模式
    #长按退出
    if button.state():
        click_timer=time.ticks_ms()          #开始计时
        while button.state():  pass       #等待按键抬起
        if time.ticks_ms()-click_timer>2000: #按键时长超过2s
            sensor.dealloc_extra_fb()
            break                         #循环退出，回到主界面
    else :
        click_timer=time.ticks_ms()#计时更新


